package com.hc.springbootes.common;

public class ESHelper {
    /**
     * Elasticsearch是一个分布式的，Restful风格的搜索和分析引擎
     *      1）能够执行及合并多种数据类型的搜索
     *      2）速度快，实现了全文检索的倒排索引
     *      3）基于各项元素（词频、热门度），对搜索结果进行排序
     *      4）集群复制，保证安全和可用
     * 1.ES安装配置
     *      1）解压ES的zip包
     *      2）创建并配置data数据文件夹 安装目录下/config/elasticsearch.yml path.data
     *      3）创建并配置logs日志文件夹 安装目录下/config/elasticsearch.yml path.logs
     *      4）启动 Windows 安装目录下/bin/elasticsearch.bat
     *      5）9300:集群通信断开 9200:客户端连接端口
     * 2.Kibana安装(基于Node.js的ES可视化工具)
     *      1）解压Kibana的zip包
     *      2）配置 安装目录下/config/kibana.yml elasticsearch.url: "http://localhost:9200"
     *      3）启动 Windows 安装目录下/bin/kibana.bat
     * 3.ES-Head安装(ES集群管理工具)
     *      1）解压ES-Head压缩包
     *      2）浏览器插件扩展添加安装目录
     * 4.配置IK分词器
     *      1）解压至ES安装目录下/plugins
     *      2）重启ES，Kibana
     * -------------------Kibana操作索引库---------------------
     * 1.创建索引
     *      PUT /索引名
     *      {
     *          请求参数,没有{}可省略
     *      }
     * 2.查询索引
     *      GET /索引名
     * 3.删除索引
     *      DELETE /索引名
     * 4.创建映射
     *      PUT /索引名/_mapping/映射名
     *      {
     *          "properties":{
     *              "字段名":{
     *                  "type":类型
     *                  "index":boolean
     *                  "store":boolean
     *                  "analyzer":分词器
     *              },
     *              "字段名"...
     *          }
     *      }
     * 5.查询映射
     *      查所有 GET /索引名/_mapping
     *      查单个 GET /索引名/_mapping/映射名
     * 6.同时创建索引和映射
     *      PUT /索引名
     *      {
     *          "settings":{
     *
     *          },
     *          "mappings":{
     *              映射名:{
     *                "properties":{
     *                      "字段名":{
     *                      "type":类型
     *                      "index":boolean
     *                      "store":boolean
     *                      "analyzer":分词器
     *                      },
     *                      "字段名"...
     *                  }
     *              }
     *          }
     *      }
     * 7.新增文档(表插入数据)
     *      POST /索引名/映射名/手动分配id
     *      {
     *          "属性名":"属性值"
     *      }
     *      不手动分配id,则自动生成
     * 8.查询文档
     *      GET /索引名/映射名/id
     * 9.修改文档
     *      PUT /索引名/映射名/id
     *      {
     *          "属性名":"属性值"
     *      }
     *      id存在则修改,不存在则新增
     * 10.删除文档
     *      DELETE /索引名/映射名/id
     * 11.动态模板
     *      映射名:{
     *          "properties":{
     *              "字段名":{
     *                  "type":类型
     *                  "index":boolean
     *                  "store":boolean
     *                  "analyzer":分词器
     *              }
     *          },
     *          "dynamic_templates":[
     *              {
     *                  "strings":{
     *                      "match_mapping_type":"string",
     *                      "mapping":{
     *                          "type":"keyword",
     *                          "index":false
     *                      }
     *                  }
     *              }
     *          ]
     *      }
     *      strings动态模板名称
     *      match_mapping_type对该类型进行动态模板定义
     *      mapping模板定义
     * -------------------查询数据-----------------------
     * 1.基本语法
     *      GET /索引名/_search
     *      {
     *          "_source":["字段1","字段2"],
     *          或
     *          "_source":{
     *              "includes":["字段1","字段2"],
     *              "excludes":["字段1","字段2"]
     *          },
     *          "query":{
     *              "查询类型":{
     *                  "查询条件":"查询条件值"
     *              }
     *          }
     *      }
     *      查询类型:match_all,match,term,range等
     *      查询条件:要查的字段名
     *      _source:过滤结果字段
     *      includes:过滤结果字段
     *      excludes:排除结果字段
     * --------------------集群搭建----------------------
     * 1.假设集群名称hc-es,3个节点,分别为node-01,node-02,node-03
     * 2.解压ES压缩包3次并重命名为es-9201，es-9202，es-9203
     * 3.创建3份对应的data和logs目录如cache9201，cache9202，cache9203
     * 4.配置集群环境
     *      1）分别配置，安装目录下/config/elasticsearch.yml
     *          允许跨域访问
     *          http.cors.enabled: true
     *          允许所有域名
     *          http.cors.allow-origin: "*"
     *          允许所有节点访问
     *          network.host: 0.0.0.0
     *          集群名称
     *          cluster.name: hc-es
     *          节点名称
     *          node.name: node-01
     *          path.data: xxxxxx/cache9201/data
     *          path.log: xxxxxx/cache9201/logs
     *          HTTP协议对外端口
     *          http.port:9201
     *          TCP协议对外端口
     *          transport.tcp.port:9301
     *          三个节点互相发现，使用TCP端口
     *          discovery.zen.ping.unicast.hosts: ["127.0.0.1:9301","127.0.0.1:9302","127.0.0.1:9303"]
     *          声明大于几个的投票主节点生效(nodes / 2) + 1
     *          discovery.zen.minimum-master_nodes: 2
     *          是否允许为主节点
     *          node.master: true
     *      2）分别配置分词器
     * 5.启动集群
     *      分别启动elasticsearch.bat
     * ------------------------补充---------------------
     * 1.倒排索引
     *      文档表:文档id + 文档数据
     *      词条表:词条id + 词条 + 文档id
     *      搜索过程：先根据词条查询文档id，再根据文档id查询文档数据并返回
     * 2.Mapping是什么？有哪些数据类型？
     *      1）类似数据库的表结构，存储的是JSON格式的数据，字段属性有是否创建索引，使用的分词器等等
     *      2）常见的long，integer，不分词的keywords，默认分词的text，对象类型等
     * 3.全文检索是什么？
     *      扫描文档中的每个词，并为这些词建立索引，记录词出现的次数和位置，
     *      讲究相关度，无明确查询条件边界
     * 4.脑裂是什么？如何解决？
     *      集群环境中由于网络等原因导致产生了多个主节点或没有主节点的情况
     *      配置选举票数为N/2 + 1，N为有效投票节点数
     * 5.分片是什么？
     *      即数据分片，一个分片可理解为一个表拆分成多个部分，N个独立的分片又组成一个完整索引。
     *      作用：实现高可用，提高并发响应能力，提高吞吐量
     * 6.分片副本的作用？
     *      提高容错和并发查询能力
     * 7.ES支持哪些类型的查询？
     *      1.DSL查询：用于解决全文检索，大部分场景使用
     *      2.脚本查询：支持编程的查询，语法类似java，用于复杂场景
     *      3.聚合查询：用于数据分析，数据聚合查询
     *      4.SQL查询：支持SQL语句查询
     *      5.EQL查询：用的较少
     * 8.拼写纠错是如何实现的？
     *      1.可通过建议器实现
     *          1）术语建议：基于编辑距离算法，提供相似词语
     *          2）短语建议：通过语言模型，纠正语义不连贯的短语
     *      2.可通过Fuzzy实现
     *          1）通过模糊匹配容忍拼写错误，基于编辑距离算法
     * 9.为何使用ES？
     *      1）是由java语言开发的，底层依赖Lucene的分布式的数据搜索、分析、存储引擎
     *      2）支持大部分主流编程语言，支持多种操作系统部署
     *      3）适用海量数据的全文检索，日志系统等
     * 10.如何提升查询效率？
     *      1）提高文件系统缓存大小
     *      2）减少非搜索字段的存储
     *      3）冷热分离：将冷门和热门数据建不同的索引，保证热门数据加载时不被冷门数据覆盖
     *      4）数据预热：对于热门搜索词，可通过定时系统去搜索一下，让其缓存至内存
     */
}
